1. 在模型类中重写 save() 方法的说明

  • 在 django 的模型类里,如果有些字段的值是需要动态生成的,那么就在模型类里添加上对应的字段,并重写save方法,在 save() 方法中对该字段进行赋值

2. 什么情况会触发 save() 方法

  • 使用添加所修改数据的时候使用 .save() 方法
  • 使用在添加数据的时候使用 .create() 方法
  • 使用 .update_or_create() 方法

3. 通过重写 save() 方法动态生成字段的值的写法

# models.py

class Book(models.Model):
    name = models.CharField(max_length=10)
    price = models.FloatField()
author = models.CharField(max_length=10)
publishing_house = models.CharField(max_length=10)

    def save(self, *args, **kwargs):
        self.author = 'Kevin'
        self.publishing_house = '东莞出版社'
super(self.__class__, self).save(*args, **kwargs) # 调用父类的 save() 方法

# 会触发 save() 方法的情况

Book.objects.create(name='三国演义', price=98.5)

# -----------------------------------------------

book = Book.objects.filter(pk=1).first()
book.name = '西游记'
book.save()

# -----------------------------------------------

book = Book(name='水浒传', price=100)
book.save()

# -----------------------------------------------

Book.objects.update_or_create(name='三国演义', defaults={'price': 99.9})

4. 动态生成字段值的例子

  • 通过用户名生成对应的 uid

# models.py

class Student(models.Model):
    name = models.CharField(max_length=10)
    age = models.IntegerField()
    uid = models.CharField(verbose_name='个人唯一ID', max_length=64, unique=True, null=True)  # unique 唯一索引

    def save(self, *args, **kwargs):
        if self.name:
            m = hashlib.md5()
            m.update(self.name.encode(encoding="utf-8"))
            self.uid = m.hexdigest()  # 生成一个 uid 字段的值
            print(self.uid)  # 17beaf58d14cbb17877dfb328452dc2d

        super(self.__class__, self).save(*args, **kwargs)  # 调用父类的save()方法